      SUBROUTINE ALLOCVAR_MPI

!
! allocates arrays
!

      use ALLOC
      use MPI_VARIABLES
      
      implicit none

      include 'soil.inc'
!      implicit real*8 (a-h,o-z)

!      allocate(ptforc(0:nxs2e,0:ns))
!
      integer(4) :: maxnxny

      allocate(wk1(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk2(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk3(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk4(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk5(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk6(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk7(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk8(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(wk9(nxs2i:nxs2e,nys2i:nys2e,0:ns1))

      allocate(u(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
      allocate(v(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
      allocate(w(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
      allocate(wsig(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
      allocate(pt(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
      allocate(meth(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))

      allocate(Radheat(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(Srad(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(Lrad(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(Srad_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(Lrad_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(SraddirUV_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(SraddirPAR_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(SraddirIR_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(SraddifUV_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(SraddifPAR_surf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(SraddifIR_surf(nxs2i:nxs2e,nys2i:nys2e))

      allocate(tsurf(nxs2i:nxs2e,nys2i:nys2e))

      allocate(dif000(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(dif100(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(dif010(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(dif001(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(dif101(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(dif011(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(dif110(nxs2i:nxs2e,nys2i:nys2e,0:ns1))

      allocate(us(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(vs(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(pts(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(tems(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(meths(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(difunu(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(difunv(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(difunw(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(difunt(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(difunmeth(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(phi(nxs2i:nxs2e,nys2i:nys2e,0:ns1))

!      call USELESS(nxs2i,nxs2e,nys2i,nys2e,nss2i,nss2e, &
!      phi(nxs2i:nxs2e,nys2i:nys2e,nss2i:nss2e))

      allocate(phis(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(s(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(thetav(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
      allocate(difcoft(nxs2i:nxs2e,nys2i:nys2e,0:ns1))

      allocate(uwind(nxs2i:nxs2e,nys2i:nys2e))
      allocate(vwind(nxs2i:nxs2e,nys2i:nys2e))
      allocate(q(nxs2i:nxs2e,nys2i:nys2e))
      allocate(potemp(nxs2i:nxs2e,nys2i:nys2e))
      allocate(zlevel(nxs2i:nxs2e,nys2i:nys2e))

      allocate(tsuf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(psufi(nxs2i:nxs2e,nys2i:nys2e))
      allocate(tsufi(nxs2i:nxs2e,nys2i:nys2e))
      allocate(phisui(nxs2i:nxs2e,nys2i:nys2e))
      allocate(deltaz(nxs2i:nxs2e,nys2i:nys2e))
      allocate(ptsoil(nxs2i:nxs2e,nys2i:nys2e))
      allocate(uvsuf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(qvsoil(nxs2i:nxs2e,nys2i:nys2e))
      allocate(methsoil(nxs2i:nxs2e,nys2i:nys2e)) ; methsoil = 0. ! it
                                                                   !is not clear what value to use
      allocate(phisuf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(phig(nxs2i:nxs2e,nys2i:nys2e))
      allocate(hk1(nxs2i:nxs2e,nys2i:nys2e))
      allocate(hk2(nxs2i:nxs2e,nys2i:nys2e))
      allocate(hk3(nxs2i:nxs2e,nys2i:nys2e))
      allocate(ppgra2(nxs2i:nxs2e,nys2i:nys2e))
      allocate(pplap(nxs2i:nxs2e,nys2i:nys2e))
      allocate(gpplap(nxs2i:nxs2e,nys2i:nys2e))

      allocate(iclay(nxs2i:nxs2e,nys2i:nys2e))
      allocate(isand(nxs2i:nxs2e,nys2i:nys2e))
      allocate(iveg(nxs2i:nxs2e,nys2i:nys2e))

      allocate(psuf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(pp(nxs2i:nxs2e,nys2i:nys2e,1:4))
      allocate(pp10(nxs2i:nxs2e,nys2i:nys2e,1:4))
      allocate(pp01(nxs2i:nxs2e,nys2i:nys2e,1:4))
      allocate(ppdx10(nxs2i:nxs2e,nys2i:nys2e,2:2))
      allocate(ppdx(nxs2i:nxs2e,nys2i:nys2e,1:4))
      allocate(dpdx10(nxs2i:nxs2e,nys2i:nys2e,3:3))
      allocate(ppdy01(nxs2i:nxs2e,nys2i:nys2e,2:2))
      allocate(ppdy(nxs2i:nxs2e,nys2i:nys2e,1:4))
      allocate(dpdy01(nxs2i:nxs2e,nys2i:nys2e,3:3))
      allocate(hsuf(nxs2i:nxs2e,nys2i:nys2e))
      allocate(dpp(nxs2i:nxs2e,nys2i:nys2e))
      allocate(hsufmax(nxs2i:nxs2e,nys2i:nys2e))


      allocate(dppref(nxs2i:nxs2e,nys2i:nys2e))
      allocate(psufref(nxs2i:nxs2e,nys2i:nys2e))

      allocate(ubx(1:2,nys2i:nys2e,0:ns1))
      allocate(vbx(1:2,nys2i:nys2e,0:ns1))
      allocate(uby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(vby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(ucc(1:2,1:2,0:ns1))
      allocate(vcc(1:2,1:2,0:ns1))
      allocate(ubx2(1:2,nys2i:nys2e,0:ns1))
      allocate(vbx2(1:2,nys2i:nys2e,0:ns1))
      allocate(uby2(nxs2i:nxs2e,1:2,0:ns1))
      allocate(vby2(nxs2i:nxs2e,1:2,0:ns1))
      allocate(ucc2(1:2,1:2,0:ns1))
      allocate(vcc2(1:2,1:2,0:ns1))
      allocate(ppbx(1:2,nys2i:nys2e))
      allocate(ppby(nxs2i:nxs2e,1:2))
      allocate(ppcc(1:2,1:2))
      allocate(ppbx2(1:2,nys2i:nys2e))
      allocate(ppby2(nxs2i:nxs2e,1:2))
      allocate(ppcc2(1:2,1:2))
      allocate(ptbx(1:2,nys2i:nys2e,0:ns1))
      allocate(ptby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(ptcc(1:2,1:2,0:ns1))
      allocate(qvbx(1:2,nys2i:nys2e,0:ns1))
      allocate(qvby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(qvcc(1:2,1:2,0:ns1))
      allocate(qcbx(1:2,nys2i:nys2e,0:ns1))
      allocate(qcby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(qccc(1:2,1:2,0:ns1))
      allocate(qcibx(1:2,nys2i:nys2e,0:ns1))
      allocate(qciby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(qcicc(1:2,1:2,0:ns1))
      allocate(qrbx(1:2,nys2i:nys2e,0:ns1))
      allocate(qrby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(qrcc(1:2,1:2,0:ns1))
      allocate(qsnbx(1:2,nys2i:nys2e,0:ns1))
      allocate(qsnby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(qsncc(1:2,1:2,0:ns1))
      allocate(methbx(1:2,nys2i:nys2e,0:ns1))
      allocate(methby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(methcc(1:2,1:2,0:ns1))
      allocate(pgradx(1:2,nys2i:nys2e,0:ns))
      allocate(pgrads(nxs2i:nxs2e,nys2i:nys2e,1:2))
      allocate(pgrady(nxs2i:nxs2e,1:2,0:ns))
    
      allocate(qsbx(1:2,nys2i:nys2e,0:ns1))
      allocate(qsby(nxs2i:nxs2e,1:2,0:ns1))
      allocate(qscc(1:2,1:2,0:ns1))

      allocate(endrag(0:ns))
      allocate(taudra(0:ns))
      allocate(deltazt(0:ns))

      allocate(ds0(0:ns1))
      allocate(ds02(0:ns1))
      allocate(ds04(0:ns1))
      allocate(ds02a(0:ns1))
      allocate(ds04a(0:ns1))
      allocate(ds08a(0:ns1))
      allocate(ds1(0:ns1))
      allocate(ds12(0:ns1))
      allocate(ds14(0:ns1))
      allocate(s1ds0(0:ns1))
      allocate(s0ds1(0:ns1))
      allocate(s0ds2a(0:ns1))
      allocate(s0ds4a(0:ns1))
      allocate(s1ds4a(0:ns1))
      allocate(ds1x(0:ns1))
      allocate(ds1dx(0:ns1))
      allocate(ds1y(0:ns1))
      allocate(ds1dy(0:ns1))
      allocate(dtxs(0:ns1))
      allocate(dtys(0:ns1))
      allocate(dxys(0:ns1))

      allocate(delka2(1:ns))

      allocate(trigsx(1:nx-1))
      allocate(trigsy(1:ny-1))
      allocate(sipcox(1:nx-1))
      allocate(simcox(1:nx-1))
      allocate(sipcoy(1:ny-1))
      allocate(simcoy(1:ny-1))
      allocate(xlamb(1:nx-1))
      allocate(ylamb(1:ny-1))
      allocate(xylamb(1:nx-1,1:ny-1))
      allocate(eigxy(2:nx,2:ny))

!      if(ifsoil.ne.0) then
        allocate(veg(nxs2i:nxs2e,nys2i:nys2e))
        allocate(xlai(nxs2i:nxs2e,nys2i:nys2e))
        allocate(rsmin(nxs2i:nxs2e,nys2i:nys2e))
        allocate(alb(nxs2i:nxs2e,nys2i:nys2e))
        allocate(emis(nxs2i:nxs2e,nys2i:nys2e))
        allocate(z0(nxs2i:nxs2e,nys2i:nys2e))
        allocate(z0h(nxs2i:nxs2e,nys2i:nys2e))
        allocate(rra(nxs2i:nxs2e,nys2i:nys2e))
        allocate(z0hw(nxs2i:nxs2e,nys2i:nys2e))
        allocate(z0w(nxs2i:nxs2e,nys2i:nys2e))
        allocate(rg(nxs2i:nxs2e,nys2i:nys2e))
        allocate(rat(nxs2i:nxs2e,nys2i:nys2e))
        allocate(xlake(nxs2i:nxs2e,nys2i:nys2e))
        allocate(watdepth(nxs2i:nxs2e,nys2i:nys2e)) ; watdepth = -1.
        allocate(pl(nxs2i:nxs2e,nys2i:nys2e))
        allocate(zonirr(nxs2i:nxs2e,nys2i:nys2e))
        allocate(tsmed(nxs2i:nxs2e,nys2i:nys2e))
        allocate(tslake(nxs2i:nxs2e,nys2i:nys2e))
        tslake = 0.
        allocate(tsnoi(nxs2i:nxs2e,nys2i:nys2e))
        allocate(t2noi(nxs2i:nxs2e,nys2i:nys2e))
        allocate(wgnoi(nxs2i:nxs2e,nys2i:nys2e))
        allocate(w2noi(nxs2i:nxs2e,nys2i:nys2e))
        allocate(wrnoi(nxs2i:nxs2e,nys2i:nys2e))
        allocate(tsurw(nxs2i:nxs2e,nys2i:nys2e))
        allocate(tmsur(nxs2i:nxs2e,nys2i:nys2e))
        allocate(rn(nxs2i:nxs2e,nys2i:nys2e))
        rn = 0.
        allocate(h(nxs2i:nxs2e,nys2i:nys2e))
        h = 0.
        allocate(le(nxs2i:nxs2e,nys2i:nys2e))
        le = 0.
        allocate(fmeth(nxs2i:nxs2e,nys2i:nys2e))
        fmeth = 0.
        allocate(gsolo(nxs2i:nxs2e,nys2i:nys2e))
        gsolo = 0.
        allocate(xdd2(nxs2i:nxs2e,nys2i:nys2e))
        xdd2 = 0.
        allocate(cdm(nxs2i:nxs2e,nys2i:nys2e))
        cdm = 0.
        allocate(rainacc(nxs2i:nxs2e,nys2i:nys2e))
        rainacc = 0.
        allocate(rhoasurf(nxs2i:nxs2e,nys2i:nys2e))
        allocate(xice(nxs2i:nxs2e,nys2i:nys2e))
        xice = 0.
        allocate(snowini(nxs2i:nxs2e,nys2i:nys2e))
        snowini = 0.

        allocate(fcveg(1:nv2,nxs2i:nxs2e,nys2i:nys2e))

!     Dima@ 110507 - Allocate buffer for impur
        allocate(le_impur(nxs2i:nxs2e,nys2i:nys2e))
!      endif

      allocate(temmax(nxs2i:nxs2e,nys2i:nys2e))
      allocate(temmin(nxs2i:nxs2e,nys2i:nys2e))
      allocate(evapor(nxs2i:nxs2e,nys2i:nys2e))
      allocate(ptforc(nxs2i:nxs2e,nys2i:nys2e))
      allocate(phi00s(nxs2i:nxs2e,nys2i:nys2e))

      allocate(tauspo(nxs2i:nxs2e))
      allocate(tauspoy(nys2i:nys2e))
      allocate(a1pos3(ns-1))
      allocate(a3pos3(ns-1))
      allocate(a21pos3(nx-1,ny-1))
      allocate(aves(0:ns))


      allocate(duul(1:ny1))
      allocate(duur(1:ny1))
      allocate(dvvl(1:nx1))
      allocate(dvvr(1:nx1))
      allocate(phibx1(nys2i:nys2e))
      allocate(phiby1(nxs2i:nxs2e))
      allocate(phibx2(nys2i:nys2e))
      allocate(phiby2(nxs2i:nxs2e))

      allocate(dphsdx(1:2,nys2i:nys2e))
      allocate(dphsdy(nxs2i:nxs2e,1:2))
      allocate(hdamp(0:ns1))

!      if(qif.ne.0.) then

!       Dima@ 13.04.07
        allocate(qs_10(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
        allocate(qs_10s(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(difunq_10(nxs2i:nxs2e,nys2i:nys2e,0:ns1))

        allocate(qv(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
        allocate(difunq(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(qvs(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(cond(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(evap(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        qvs = 0.
        cond = 0.
        evap = 0.
!        if(ifqc.ne.0) then
        allocate(qc(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
        allocate(difunqc(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(auto(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(col(nxs2i:nxs2e,nys2i:nys2e,0:ns1))

        difunqc = 0.
        auto = 0.
        col = 0.
!          if(ifqr.ne.0) then
        allocate(qr(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
        allocate(vrain(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(difunqr(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(prec(nxs2i:nxs2e,nys2i:nys2e))
        allocate(rainw_subsid(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        difunqr = 0.
        vrain = 0.
        prec = 0.
        rainw_subsid = 0.

        allocate(qci(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
        allocate(difunqci(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        difunqci = 0.

        allocate(qsn(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3))
        allocate(difunqsn(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        difunqsn = 0.

        allocate(vini(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(imlt(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(hmfrz(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(sacrw(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(sacrwr(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(sbercw(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(ibercw(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(smlt(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(sacrr(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(iacr(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(sberci(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(sagg(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(saci(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate(raci(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        vini = 0.
        imlt = 0.
        hmfrz = 0.
        sacrw = 0.
        sacrwr = 0.
        sbercw = 0.
        ibercw = 0.
        smlt = 0.
        sacrr = 0.
        iacr = 0.
        sberci = 0.
        sagg = 0.
        saci = 0.
        raci = 0.


        allocate (sumsources(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate (meth_OH_oxidat(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate (OHconc(nxs2i:nxs2e,nys2i:nys2e,0:ns1))
        allocate (zeroarr(nxs2i:nxs2e,nys2i:nys2e,0:ns1)) ; zeroarr = 0.
!            rainacc=0.
!          endif
!        endif
!      endif

      maxnxny = max(nx1,ny1)
      allocate(a1sphi(0:maxnxny))
      allocate(a2sphi(0:maxnxny))
      allocate(a3sphi(0:maxnxny))
      allocate(csphi(0:maxnxny))
      allocate(dsphi(0:maxnxny))

      allocate(zlevm(nlev),zlev(0:nlev))

      allocate(w1d1(0:ns1))
      allocate(w1d2(0:ns1))
      allocate(pequiv(nxs2i:nxs2e,nys2i:nys2e))

      allocate(panom(nxs2i:nxs2e,nys2i:nys2e))
      allocate(pini(nxs2i:nxs2e,nys2i:nys2e))

      allocate(emo(ns,ns))
      allocate(emi(ns,ns))
      allocate(vlam(ns))
      allocate(e(ns1))

      return
      END SUBROUTINE ALLOCVAR_MPI
